{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8cd8fa6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import gym\n",
    "import numpy as np\n",
    "import collections\n",
    "from tqdm import tqdm\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "import matplotlib.pyplot as plt\n",
    "import rl_utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "eb5d5b4b",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ReplayBuffer:\n",
    "    ''' 经验回放池 '''\n",
    "    def __init__(self, capacity):\n",
    "        self.buffer = collections.deque(maxlen=capacity)  # 队列,先进先出\n",
    "\n",
    "    def add(self, state, action, reward, next_state, done):  # 将数据加入buffer\n",
    "        self.buffer.append((state, action, reward, next_state, done))\n",
    "\n",
    "    def sample(self, batch_size):  # 从buffer中采样数据,数量为batch_size\n",
    "        transitions = random.sample(self.buffer, batch_size)\n",
    "        state, action, reward, next_state, done = zip(*transitions)\n",
    "        return np.array(state), action, reward, np.array(next_state), done\n",
    "\n",
    "    def size(self):  # 目前buffer中数据的数量\n",
    "        return len(self.buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b01a60c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Qnet(torch.nn.Module):\n",
    "    ''' 只有一层隐藏层的Q网络 '''\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim):\n",
    "        super(Qnet, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, hidden_dim)\n",
    "        self.fc2 = torch.nn.Linear(hidden_dim, action_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))  # 隐藏层使用ReLU激活函数\n",
    "        return self.fc2(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2887db36",
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQN:\n",
    "    ''' DQN算法 '''\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma,\n",
    "                 epsilon, target_update, device):\n",
    "        self.action_dim = action_dim\n",
    "        self.q_net = Qnet(state_dim, hidden_dim,\n",
    "                          self.action_dim).to(device)  # Q网络\n",
    "        # 目标网络\n",
    "        self.target_q_net = Qnet(state_dim, hidden_dim,\n",
    "                                 self.action_dim).to(device)\n",
    "        # 使用Adam优化器\n",
    "        self.optimizer = torch.optim.Adam(self.q_net.parameters(),\n",
    "                                          lr=learning_rate)\n",
    "        self.gamma = gamma  # 折扣因子\n",
    "        self.epsilon = epsilon  # epsilon-贪婪策略\n",
    "        self.target_update = target_update  # 目标网络更新频率\n",
    "        self.count = 0  # 计数器,记录更新次数\n",
    "        self.device = device\n",
    "\n",
    "    def take_action(self, state):  # epsilon-贪婪策略采取动作\n",
    "        if np.random.random() < self.epsilon:\n",
    "            action = np.random.randint(self.action_dim)\n",
    "        else:\n",
    "            state = torch.tensor([state], dtype=torch.float).to(self.device)\n",
    "            action = self.q_net(state).argmax().item()\n",
    "        return action\n",
    "\n",
    "    def update(self, transition_dict):\n",
    "        states = torch.tensor(transition_dict['states'],\n",
    "                              dtype=torch.float).to(self.device)\n",
    "        actions = torch.tensor(transition_dict['actions']).view(-1, 1).to(\n",
    "            self.device)\n",
    "        rewards = torch.tensor(transition_dict['rewards'],\n",
    "                               dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        next_states = torch.tensor(transition_dict['next_states'],\n",
    "                                   dtype=torch.float).to(self.device)\n",
    "        dones = torch.tensor(transition_dict['dones'],\n",
    "                             dtype=torch.float).view(-1, 1).to(self.device)\n",
    "\n",
    "        q_values = self.q_net(states).gather(1, actions)  # Q值\n",
    "        # 下个状态的最大Q值\n",
    "        max_next_q_values = self.target_q_net(next_states).max(1)[0].view(\n",
    "            -1, 1)\n",
    "        q_targets = rewards + self.gamma * max_next_q_values * (1 - dones\n",
    "                                                                )  # TD误差目标\n",
    "        dqn_loss = torch.mean(F.mse_loss(q_values, q_targets))  # 均方误差损失函数\n",
    "        self.optimizer.zero_grad()  # PyTorch中默认梯度会累积,这里需要显式将梯度置为0\n",
    "        dqn_loss.backward()  # 反向传播更新参数\n",
    "        self.optimizer.step()\n",
    "\n",
    "        if self.count % self.target_update == 0:\n",
    "            self.target_q_net.load_state_dict(\n",
    "                self.q_net.state_dict())  # 更新目标网络\n",
    "        self.count += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "427f31b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0:   0%|          | 0/50 [00:00<?, ?it/s]C:\\Users\\Dearest0\\AppData\\Local\\Temp\\ipykernel_14560\\725080296.py:24: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at  C:\\cb\\pytorch_1000000000000\\work\\torch\\csrc\\utils\\tensor_new.cpp:204.)\n",
      "  state = torch.tensor([state], dtype=torch.float).to(self.device)\n",
      "Iteration 0: 100%|██████████| 50/50 [00:03<00:00, 14.21it/s, episode=50, return=9.300]\n",
      "Iteration 1: 100%|██████████| 50/50 [00:01<00:00, 28.08it/s, episode=100, return=12.300]\n",
      "Iteration 2: 100%|██████████| 50/50 [00:08<00:00,  6.08it/s, episode=150, return=123.000]\n",
      "Iteration 3: 100%|██████████| 50/50 [00:22<00:00,  2.18it/s, episode=200, return=157.600]\n",
      "Iteration 4: 100%|██████████| 50/50 [00:23<00:00,  2.16it/s, episode=250, return=200.000]\n",
      "Iteration 5: 100%|██████████| 50/50 [00:28<00:00,  1.73it/s, episode=300, return=193.200]\n",
      "Iteration 6: 100%|██████████| 50/50 [00:40<00:00,  1.24it/s, episode=350, return=193.500]\n",
      "Iteration 7: 100%|██████████| 50/50 [00:26<00:00,  1.91it/s, episode=400, return=200.000]\n",
      "Iteration 8: 100%|██████████| 50/50 [00:21<00:00,  2.34it/s, episode=450, return=195.600]\n",
      "Iteration 9: 100%|██████████| 50/50 [00:20<00:00,  2.43it/s, episode=500, return=189.800]\n"
     ]
    }
   ],
   "source": [
    "lr = 2e-3\n",
    "num_episodes = 500\n",
    "hidden_dim = 128\n",
    "gamma = 0.98\n",
    "epsilon = 0.01\n",
    "target_update = 10\n",
    "buffer_size = 10000\n",
    "minimal_size = 500\n",
    "batch_size = 64\n",
    "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\n",
    "    \"cpu\")\n",
    "\n",
    "env_name = 'CartPole-v0'\n",
    "env = gym.make(env_name)\n",
    "random.seed(0)\n",
    "np.random.seed(0)\n",
    "env.seed(0)\n",
    "torch.manual_seed(0)\n",
    "replay_buffer = ReplayBuffer(buffer_size)\n",
    "state_dim = env.observation_space.shape[0]\n",
    "action_dim = env.action_space.n\n",
    "agent = DQN(state_dim, hidden_dim, action_dim, lr, gamma, epsilon,\n",
    "            target_update, device)\n",
    "\n",
    "return_list = []\n",
    "for i in range(10):\n",
    "    with tqdm(total=int(num_episodes / 10), desc='Iteration %d' % i) as pbar:\n",
    "        for i_episode in range(int(num_episodes / 10)):\n",
    "            episode_return = 0\n",
    "            state = env.reset()\n",
    "            done = False\n",
    "            while not done:\n",
    "                action = agent.take_action(state)\n",
    "                next_state, reward, done, _ = env.step(action)\n",
    "                replay_buffer.add(state, action, reward, next_state, done)\n",
    "                state = next_state\n",
    "                episode_return += reward\n",
    "                # 当buffer数据的数量超过一定值后,才进行Q网络训练\n",
    "                if replay_buffer.size() > minimal_size:\n",
    "                    b_s, b_a, b_r, b_ns, b_d = replay_buffer.sample(batch_size)\n",
    "                    transition_dict = {\n",
    "                        'states': b_s,\n",
    "                        'actions': b_a,\n",
    "                        'next_states': b_ns,\n",
    "                        'rewards': b_r,\n",
    "                        'dones': b_d\n",
    "                    }\n",
    "                    agent.update(transition_dict)\n",
    "            return_list.append(episode_return)\n",
    "            if (i_episode + 1) % 10 == 0:\n",
    "                pbar.set_postfix({\n",
    "                    'episode':\n",
    "                    '%d' % (num_episodes / 10 * i + i_episode + 1),\n",
    "                    'return':\n",
    "                    '%.3f' % np.mean(return_list[-10:])\n",
    "                })\n",
    "            pbar.update(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "81d8b0af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA7B0lEQVR4nO3dd3xb9b34/9fb8t4723ESQkICGRDSAmVDWaW0pS2jFygdQC/9ddwuKJTSwe2k7bfr3gIFessulNFCGQUKpYVAQvZeTmLHiR3vKVvS+/fHOVJkR96SZdnv5+Ohh6XPOdL5HNk+7/PZoqoYY4wxAEnxzoAxxpixw4KCMcaYEAsKxhhjQiwoGGOMCbGgYIwxJsSCgjHGmBALCsYYY0IsKBgzzohIuYioiCTHOy8m8VhQMKNKRCpEpENEWkSkUUT+LSI3iEhSr/1OFpFX3P2aROQZEZkftv0M98L3m17ve0NEPjlK53KeiLzu5rFWRF4TkQ+O4PMqROScsNfBi3ur+6gQkZuik/th5/FsEdkiIu0i8qqIzIxnfkz0WVAw8XCxquYAM4EfAt8Afh/cKCInAS8CTwNTgVnAOuBfIlIe9jltwNW90kaFiHwU+BPwf8B0YBJwG3DxMD5roDv6fFXNBq4AbhOR84d6jGgQkWLgz8C3gEJgJfBoPPJiYkhV7WGPUXsAFcA5vdKWAwHgWPf1P4HfRnjv34D73OdnAJXAr4JpbvobwCf7OHYa8Atgv/v4BZDW6/O+AtQA1cC1fXyOAHuBr/VznnOAV4A64BDwIM7FPfx7+AZOsPMCD7vfQQfQCnwdKAcUSA573zvAV3Fu6G4F9rj5/T8gz92nx/uAPJygWw1UAd8HPH18P43B34ObVuLmqRS4Dvh32LYsd9v8eP9d2SN6DyspmLhT1bdxLsinikgmcDLOXXhvjwHv75V2B3CpiMwbxKFuAd4LLAEW4wSjW8O2T8a5gE4DPg38RkQKInzOPGAG8Hg/xxLgBzglnWPc/W/vtc8VwEU4weIKnEBzsapmq+qPe3yY4xRgIbAa+KT7OBOYDWQDv+4jL38AfMBRwFKc7/AzvXdSVS9OSeCKsOSPA6+pao177LVh+7cBO910M05YUDBjxX6cKolCnL/L6gj7VOPcuYao6gHgf4HvDuIYnwC+q6o1qloLfAe4Kmx7t7u9W1Wfw7ljjxRsisLyE5Gq7lDVl1TV6x7rZ8DpvXb7paruU9WOAfJ9CKgH7gFuUtWX3XP5maruUtVW4Gbg8t5VUSIyCbgA+JKqtrkX958Dl/dxrIfoGRSudNPACTxNvfZvAnIGyL9JINY7wYwV03AufA041ShTgC299pkC1EZ474+AnSKyeIBjTMWpbgna46YF1amqL+x1O86FsLe6sPzsjnQgESkFfgmcinPRTMI5t3D7BshvUHGvfEHkc0nGadsINxNIAapFJJiWFDy2iGx09wEneLwCZIjIe4ADOKWqJ93trUBur8/PBVoGeR4mAVhJwcSdiJyIExTecKsk3gQ+FmHXjwOv9U5U1Tqc9oHvDXCo/Ry+AAKUuWlDtRXnonppP/v8AKdef5Gq5gL/gVOlFK73vPVDmcc+0rn4gIO99tuH02ZRrKr57iNXVRcCqOpCt7oqW1X/qaoBnGq6K3BKCX9V1eBFfyNOtRsAIpKF03aycQj5NmOcBQUTNyKSKyIfAB4BHlDV9e6mm4BrROQLIpIjIgUi8n3gNJyLbSQ/w2mLOKafQz4M3CoiJW5PmtuAB4aab1VV4L+Ab4nIte55JInI+0TkLne3HJw760YRmQZ8bRAffRCnfWAwHga+LCKzRCQb+G/g0d4lClWtxunJdWdYPueISO+qrHAPAZfhVFE9FJb+JHCsiFwqIuk43986Ve1dojMJzIKCiYe/iEgLzl3sLTgX9GuDG1X1DeA84CM49fb1wDXAWWGBowdVbQZ+jNMm0Zfv43SjXAesB95104ZMVR/HuXB+Cueu/aD7WU+7u3wHOB6nzv1ZnAbcgfwAJ2g1ishXB9j3XuCPwOs4VVidwP/Xx75XA6nAJpwqrMdxqr4iUtUVON19p+L0+Aqm1+KUju5wP+c99N02YRKUODc9xoxdblvBK8CVqvpCvPNjzHhmJQUz5qnqWuBDwHE2dYMxsWUlBWOMMSFWUjDGGBOS0EXx4uJiLS8vj3c2jDEmoaxateqQqpZE2pbQQaG8vJyVK1fGOxvGGJNQRGRPX9us+sgYY0yIBQVjjDEhFhSMMcaEWFAwxhgTYkHBGGNMSMyCgojMcNdw3SwiG0Xki256oYi8JCLb3Z8FYe+5WUR2iMhWETkvVnkzxhgTWSxLCj7gK6p6DM5qVzeKyAKcGTBfVtW5wMvua9xtl+Os4nQ+8FsR8cQwf8YYY3qJ2TgFd8reavd5i4hsxpkz/xKc9XDBWSbwHzhr1V4CPOIuCbhbRHbgLJf4ZqzyaMxg7KtvZ31VExced+TEoj5/gHv/tZvWzsMzVh89OYcPLJraY7+a5k4efnsfqclJfOK9ZeSmp4S2dfkCPLhiDw1tXX3mIS3Fw7WnlJOZ2v+/bCCgdHT7Q68zUz2ELa4zItVNHbyypYYkES4/cUbEzz3Q1MnaykbOWzh5WMfYtL+Z5zf0uaBdn9JTPXzqlFmkpwzvPjIQUO7/dwUlOWlcvHjqwG/owzNr9/O+o4opzErtkf78hmoWTs1jRmHmsD97tIzK4DURKcdZG3YFMMkNGKhqtbtCFTgB462wt1W6ab0/6zqcBcQpKyuLYa7NRNfS2U1jezfn/+J12rr8vHPLOZTkpPXYZ9WeBv77OWc5ARFQhVRPEhccOwVP0uGL5qPv7OPnf98GwP97eRupnsOFdF9Aae/y09e1Ozg9WUl2Gh8/cUa/eb763rd5Y8eh0OvLT5zBDy9dNOhzPvLYyp9WVlLb6uWRd/ayr95ZObSm2cvZx5Ry7LS8Hvt/8r632XKghU3fPW/AABbJz/++jZc2Hezzu4icR+fnnJLsiMHo75sOclRpNuXFWX1+xprKRr77100AnLtg0rCCy/aDLXzh4dVceNxkfvuJE0LpgYBywwPvArDt+xeQmjy2m3JjHhTcBUCewFkjtrmfu5ZIG46YrU9V7wLuAli2bJnN5mdGpL3LR7dPyctM6ZHu8wc486evcajVG0r7x9YaPras50W5ssG5SL761TOYVZzFA2/t4danNnCo1cuk3PTQflWNHZTkpPGbK4/nufVH3gm/d3YR5x8b+e5aVTnh+3/n7Yr6foNCly/Ait11nDq3mFPnFvPU6v28U1E/8JfQjw1VzXz9iXUAZKcl8+srl/KzF7fx879v45F39vLmzWf32H/3oTYAKg61s2Bq75U7B7a3rp1zjpnEPdcsG/R7mtq7WfzdF9lb194jvdXr45Jfv8HO2jbOXziZ/73qhD4+ATZWHV56eldtW79531vXzo7aFk6dW0JKWHDfXtMKQEtnz5VTmzq6Q89vfOhd7r568OfWl0BASUqKTgmwt5gGBRFJwQkID6pqcJGRgyIyxS0lTAFq3PRKIPwvfjrDWyrRjDOPvL2XdVVN3HTB/B7VLtHwqfvf4a1d9Wy/44Ie/+BbDrRwqNXLJ08uZ8mMfL79zEZejRAUqhqdoDAlzwkA0/IzQum9g8LU/AyWzypk+az+1gE6kohwYnkBj6+qpKGti//5jxN63G0GAsqK3fWs2ddIt1/5+LIZXLx4KnVtXdz3RgX+gPYotQzFi5sOkCTw1s1nU5iVSrIniTPnlfKTF7byhzcr8PkDJId9b1lpyXh9XVTU9X9hjURV2VvfzilHFQ/pfXmZKeRlpLCnvq1H+tYDzeysddI6ff5Ibw1ViT0bFqi3HWzpN++fvP9tdtW28asrlrJ8ViGb9jcD8NImZyXUkuyepcmG9sPVgsF9R+Ku13fy389tYeN3ziMrLfqX8Fj2PhLg98BmVf1Z2KZncFbRwv35dFj65SKSJiKzgLnA27HKn0kcN/15PQ+t2MtrW2uj/tlv7XLupP+24UCP9JXuHfZnT5vNh5ZO44JjJ/PPbYfo8gV67FfV4JQAgtUNU92gsN8NFkH7GzuYlp/OcH3l/fM4eU4RL2+pYeuBlh7b3txVxxV3v8WPnneqsRa6F7RZRVl0+QNH5GWw3tpVx93/3MUpRxVTmpseuvhnpSVzVGk2qlDXqx0kw/0enl039HaBurYuOrr9lBVmDPm9M4sy2VXbMyjscUsO0/IzaGzvjvQ2fvrCNm55cgNv7arn3AWTSPEIX398HZ9/6N3QPodavTy1ugpVpb3LFzrO2n2NXHPv21x7/ztce/87PLm6CoC2rp4lhWBQWDwjn+qmjiP+hobq0Xf2AbCvoX2APYcnliWFU4CrgPUissZN+ybwQ+AxEfk0sBd3gXZV3Sgij+EsGegDblTVyOHdTBgdXYf/BDZVN4+oEbC32pbDVUNvbK/lg+5nqypPr93PzKLM0J3/aUeX8Mg7+9hc3cziGfmh91U1doT2AZjqXvhf2VJDuKrGDs6cV8pwHT0ph1svWsCFv/wne+vbOW764br8nbVOtcUdHz6WutYuZrl15zOLnJ87aluH1cD5uQdW0dkd4MvnHn3EtmDbSk1zz2qydveC+Oz6aj5X1XREm0O4Z9dVc/tfNhJc08UXcH4OJ6/lRVk8s3Y/X350DcvKC7j0+OnsqWtHBBbPyGN9WPVQuA1VTZw6t5g7P76Yoqw0nlpdxfMbD/DXddXsPvRPrjttNusrm7jnjd2s2dfYo8R1zxu7AfjaefNCpZtvPL6OhraeAajefb1keh5r9zVS2dDO7JLsIZ9jUHF2Gjtr26hu6mT+5KFX0Q0klr2P3iByOwHA2ZESVfUOnPVfzQR32e/eZH1VE7+8fGkobWMUit7hzrrzHwCkJifx2MpKCrJSWTQtn6n56aze28j3LlkY2rfcvcBWNnSEgkIgoGw50Mxpcw/PQJyTnsKUvHT+/G4Vf363qsfxjp6UM6L8lhU5F8u99T3vEPfWtZOeksSVy8t69Ag6bnoeqZ4krr3vnR4Nt18/bz6fO2NOv8fy+vw0tHfzyZPLOb6s4IjtpcGg0NIJ5KGqbD3YQkN7NyfPKeLfO+vYtL+536Dw1q46Wjq7ufT46aG0rLRkTp4ztOojgC+eM5ckgafWVPHk6ir+ue0QNS2dTM3LYHJuRsRSZm2Ll60HWzh3wSRKc5zAdukJ07lo0RS+9dQGXtlSw0Mr9oZ6Et3/7woActKTOW1uCc+ur2b+5Bw+c+os0pKdEtLskqxQ20JQsFfZkrJ8/vDmHl7bVjuioBAMyMH2rGhL6KmzzfgUrCMH+NyDqwCYU5LF2n2NI6ofD9fQ1kVLp4+ZRZlc9d6ZfP/Zzdzzz934A8pJs4tIThI+uPhw57dpBcG2gsMX5PVVTRxq7eK0o3tOS//8F09zL5aHeZIkdAc/XNlpyRRlpbKpupmdta2UF2XhSRL21rdTVph5RBfR7LRkbrpgPo+t3MdZ80tJThL+sq6a5zdUDxgUgne7cydFvniVuqWDqsYOOrr8PPFuJbc+tQGADy2dxso9DWyvaYn43tAx2ruYkpfBHR8+blDn3585Jdn84vKl/PDSRfz0ha2hu/gLjp1MUXYqbV1+Orv9PXoVffI+p3Z60fSegSs9xcNPPraY25/ZyGMr9zE5N53MVA/tXX5+fOkiPrR0Go0dXZwxr4Sz5peGAgJAQVYqje09q9SC1UenHFXMlLx0fvLCVq5YXjbs7rM5brtaZX3iVR8ZMyz1Yf9U3X6nSuGK5WV8/9nNrK1sjHjnOlSbDzilju9dciynHFXMxYun0t7l56w7/8Gbu+o455jSHj2S8jJSyElLpirs7uzlLTUkCZzeKyjkZaYc0ZspWmaXZPGXtfv5y9r9/OcZc5hVnMUrW2o4Y17E9VL41Ptm8an3zQq99gWUu17fRUeXn4zUvi9KdW1O1VpRr/72QcXZqSQJ3Pb0Rm57eiPg1Jl/6ey5nHxUEfe+sZt73tjN58446og++0GN7d3kR/l7Sk/xcOsHFnDjmUcRUCU/M5U/rXTq4LceaOlR9Xeo1cus4izOPmZSxM9aPCOP+/9dwa5DbXz+zKO46qSZoaqy0pz0IzodABRmplLf1sW33AAJsGZfI6meJEqy0/j2xQu54YFVbKhqYlm50+GgzevD6wv0+T315nUbza2kYCaMg83OXfaPL11EW5ePVXsa+Mjx0/n+s5t5c2fdiILCjpoWvvnkhtAxjpmSiydJQv/sf7r+JOraunhfhB4w0woyWFfVxPNuo/Tf1ldzfFkBBYP8Z46Gn35sMWsrm/jly9t5cMXeUHfH8CqY/iyfVchv/7GTY257noc+8x5O7qOnT12rE5gLs9Iibk9L9vDbT5xARZ3T6CrABcdOCVVxHT+zgC0HWnhqdVWPoBSuob2LybnDb3zvT/jvJFjK+9wDq/i324VWValv6+Ijx0/vs+R57oLJXH96C90+5bITZ/RoO+nLsvICirLTevRmAjh9XgkiwrJy52/3nYqGUFA4685/cLDZS8UPLxrUuXm7nYbqb5w/f1D7D5UFBTNmPLhiD8eXFVDT7NylzinN5oSZBVx7inNRmV6QwZYD/VdJDOSu13exrrKRE8sLOXNe6RGD0YL/qJHMnZTDX9bu54YHVoXSbrnwmBHlZ6hmFmUxsyiLFbvqeHDFXgBe+9oZoUblgYTX13/v2c387YunRtyvvi0YFPoOeH2NqwD4zgcX8tCKvbR5fX3u09DWFZOG0t5OmVPMh5dO48nVVeyoaWF6QSZeX4Buv/ZZEgKn+u3mC4b2+z1jXinv3HJOn9uLs9OYW5rNv3Yc4nNnzOGmJ9ZxsNnb5/6RdHb7WTg1NxSAo82CghkTuv0BbnnSKXJff/psACbl9rxgz5uUw7YRBAVV5bn1B7h40VR+8rHFQ37/Tz66iM+dfrgu3pMkHFU6/AbDkVg41akHz0lLpmwIvXVSk5O4+YL5/OBvW9hV20qXL9BjzENNSye/fXUnaysbAaeaaDhSPEmkeIT27r47EDa0d1MQo2q2cElJwn+eMYcnV1dxzs9eJzlJ+PWVTgeGomGe30icNb+U372+i0/d/84RvdR6CwQUvyrJScKf361iZlEmnT7/sNsjBsOCghkTgtU5AL97bRfAEXfxR0/O4fXttXT7Az0Gmg3WodYuWr2+UD/+oUpP8QxrlG4sXHTcFPbWt3NiecGQ5za6/vQ5FGSl8vXH13GgqbPHHecLGw+GetkAIxosmJHi6dGlOFxnt5+Obv+oVb3NnZTDL69Yyt66Nn764jaeXe9UAfZVPRZLlyyZxl/XVfP6tv7H3XT7A5z/i9fZWdsWKukAlBdlhqrEYsGCghkT9jf27K1z2wcW9OjVAXDctDy6/cr6qqZhtSsEu3ImwqRkA8nLTOGmC4Zfpzw1z7moVDd19AgK1e5At+9espDSnPQRTaWQkeoJjVvoLTiYLNoNzf354OKpqDoT37221blD76/6KFYWTM3lXzedhT+g/OC5zaGeUr29vPkgO2vbyE1P5u3dh6crqahrZ84IurQOZGzPzGQmjPBRt7dfvCBi4+R7ZxchAv/afuiIbYNR6Y4AHUp1y3g12Z2Wo7qpZzCubupkWn4GV59U3m+bwWBkpibT3kdJobnTCQrRnrZkICLCwql5NLvzExVnj35JIciTJPznmUeFXvv8PUc6r9hdT2aqh3OOmRSaTiXIqo/MuKaqPPFuZeh1YR//qIVZqcyblMPKPQ3DOs4+t6QwvcCCQnDk9f6mI6fjmDqC6TjCZaR46OyjTaHVbYDOjsHcPQP5r3OP5uhJ2UzKTT+i3Wq0FWal8s0L5/Pfz22h0xcgO6xatLPbT1Zaco/uzaU5adS0eElLid39vAUFE3c7a1v5p3v3f97CSZxzTN/TQcwpyWZT9fBGNu9v6qQwK7Xf/vkTRWZqMrnpyfz4+a2UFWZy1vxSdta0sb+pg6UzRj4OxDmGp8+SQnD9iez00b8ELZ6R32O8QrwF7/o7u/09gmRnd4D0lKQepakTywt5dn11TEsKVn1kRl3FobbQpGD76ttDdf13X72M3121rN95+MuKMqlsaMcfGPqs6XWt3mH3phmPPnL8dLLTkvn8Q6v5ymNrufjXb7CvviNqjZgZ/QSFYFfVrGGsuTDepLm9v3qXqrw+P+nJHnLcwJnkzuME0NnH9xoN9hsxo6qpo5szfvoPirJS+dWVS7ny7hWheXkGU9dfVphJt1+pbuoYcjVQXWsXRXHobTJW3f7BhXzj/Pkcc9vzParkTp079LmHIslM9YTGnPQWz+qjsSZ41+/tNXuqU1LwkJvhlBQm5aaH/uYbOyLP+hoNVlIwoyq4aE1dWxdX3r0COLxyVkHWwI2OwcDRe1K4gVz1+xWs3NNAcY4FhXAZqR5mFmX2mDH2PbOKovPZKZ4eS4OGC5UU0qwqL9jLrndJwZmrKYlct6QwJS891DDe0Gt+pWiyoGBGVXD6hEjyMwau2gkFhbrBBwWfPxBqs4hHF8SxLjhqOSc9mc3fPT8qEw4CZPTT+6jNTY/FIjGJJj0lWH3Uu6TgDFILToA3JT8jNNjOE6V1tyOx34gZVeHLW4bLTkse1Nq1U/LSSXZnBh2s8KkxYtlAl6iCgbK8KCuqjfCZqR46+hin0NLpIzlJQvXpE1mwpOD19S4pBCjM8oQamqflZzC7OIubLpjPBxZNiVl+LCiYUVXXR1AY7CCmZE8S0wsyhhQUVoatU1zfNrR5ZiaCYEmhv4XthyMz1UN7tx9VPWLUdZvXR3Z68pBHY49HwZKCt3dJwedWH2Ucrj4SEW44vf9pz0fKwrQZVbVh1UcfWDQltGrZUAYxpSYn8dd11dz44LtHDPiJ5PXth8hM9TA5N51rTi4fcp7Hu2C1xfFl+VH93IxUD6pHVouAExSs55EjWHp9dn013/nLRv74ZgXgBIn0FA9lhZncetExXLJkWj+fEj2xXKP5XhGpEZENYWmPisga91ERXKZTRMpFpCNs2//GKl8mfg61evnly9sBZ3bRX12xlC+ePRcY2sRkwZXOnl1fPeCsqT5/gLd21XHp8dN565tnhyaSM4cFGzij/d0E24iaIvSUafX6rOeRK1iF9viqSu77VwXffsZZojTY0CwifObU2YNeb2GkYvlbuR/4NfB/wQRVvSz4XETuBMIXTt2pqktimB8TZ0+5E3odNy2Pz57mzIR6ydKplOSmsWDK4Cea+9r58zjrmFKuvHsFFXVt/S75uKO2lfYuPyfMjM6ArPHotosXcMyU3Kh/R8GLWF2bNzStRlBbl896HrnC27mWzMhnzb5Gmjt9dHb7j5j/azTErKSgqq8D9ZG2iVOR+HHg4Vgd34w9r28/xOziLJ668ZRQWlqyhzPnlQ5qAZPw9yxxR6TuGaAX0vpK576jv8Ax0U0vyOTL5x4dtV5HQcGgEFybIVxDWzf5mdYTDHoGhctOdFZzq27qoNMXCLU3jKZ4tSmcChxU1e1habNEZLWIvCYikVf+AETkOhFZKSIra2v7n3rWjC2bq5tZVl4QlYtPZmoyJTlp7HFX/urLxv3NZKR4Rrw+shm6/oJCfVvXqFWHjHXBEtNFi6Zw9KQcwOly7Q8o6XEoKcSrUu8KepYSqoEyVa0TkROAp0RkoaoeMcmNqt4F3AWwbNmyoc91YOKmzeuL6qyYs4qy2FHT2u8+VY0dlBVmRv0u2Aws2NW199iU4FKYNmbEkZbsYfW3ziU/M4UD7roiuw85Nzvx6EI96iUFEUkGPgI8GkxTVa+q1rnPVwE7gaNHO28mdgIBpb3LH9XBSgun5bK5uqXfHkg1LV5K4zwT5kSVl5GCJ0mOKCm0en10+Qe/UP1EUJCViohQmpOOJ0nCgsLEqD46B9iiqqG5kkWkREQ87vPZwFxgVxzyZmIkuCxjNBsXF03Po6Pb328PpNrmziNWcDOjIylJKMhMoa5XUBjM+s8TlSdJmJybHioBp42nkoKIPAy8CcwTkUoR+bS76XKObGA+DVgnImuBx4EbVDViI7VJTO2huW6iV1I4oayQJIGv/mktqkfWJKoqta1eSnOisz6AGbrCrNQjBgwGg0Q81kdOBFPy0kMTFMaj227MjqiqV/SR/skIaU8AT8QqLyb+WmMwVXJZUSafPW02v3ttV8SLf0N7N91+pdRKCnHjBIWeJYWGUEnBfi+RBLvvTsvP4Mx5fa8tEis2otmMivYYTYB2ujuQbduBIxuca1qcRruhdHc10VWUlXZEUAiVFKz6KKLgWiNfOPuouCwIZUHBjIoHV+wBICvKf+RHT3a68G09eGS7QmW9s9RktJaXNEMXqaRgbQr9y3PXT5hdkh2X49s4cxNzu2pbefjtfUD0SwrF2WkUZaWyPUJQqHDHMNgYhfgpzEqlsaMbf0BD3YLr27pIS04i05ZFjejWixZwwswClsVpFL6VFEzMhU+IFov584+elMNf11WHRi8H7T7URl5Gio2cjaPCrFRUey4K46yAl2ozpPYhLzOFy5eXxe37saBgYi7YyAyxWWnr6EnZtHp9XPzrN3qMWaioa4v6dNBmaCKNaq5v81JoPY/GLAsKJuZavYdnyYxFSSG8JBBcYQ2g4lA7s4qGto6zia5Io5qdKS6s59FYZUHBxFxL5+GSQmYMBuNcfdJMrj5pJgArdte7o6d97G/qsJJCnAVvAjq6D/8N1NkUF2OaNTSbmAtWH933yRNJ9kT/PqQoO43vXnIs7+5tYOP+Jq6+923e2OGUGMqLLCjEU3DunvB2pYa2LgqsnWfMsqBgYi5YUlg+qzCmxzl2ah7PbzxAY/vh6iorKcRXhhsUOtxxKoGA0tblJyfdLj1jlVUfmZhr7fSRJMS8C+LcSTk9AgI4M6ma+AlO6Nbhzn3V6S5OH49BWWZwLCiYmAsuvRjrLnbB9Z7D5WVGb6puM3TpqcHqIycYBEe22xiFscuCgom55s5ucqK4jkJfegcFW0Ih/oKLxASDQrAaKSMOs3+awbGgYGKqoa2LP79bNSqzPYZPZ5GTlswDn3lPzI9p+pfiETxJEmpoDlYjZUZxYkQTXfabMTH12jZnydR57hxFsRQ+l867t51LSgx6OpmhERHSk5NCwcCqj8Y+CwompoIzYn7vkmNjfiwR4YOLp3JUabYFhDEkI9UT1qbg9ESLxzKTZnAsKJiYqm/z4kkScjNG50/tl1csHZXjmMFLS/aESgodVlIY8+x2ysRUvTtQySY/m7gyUj143TYFqz4a+2K5HOe9IlIjIhvC0m4XkSoRWeM+LgzbdrOI7BCRrSJyXqzyZUZXcEZMM3GlpxxuUwj+tHEKY1csSwr3A+dHSP+5qi5xH88BiMgCnLWbF7rv+a2I2F/NONDQ3mWLqUxwGSmeULXR4eojq7keq2IWFFT1daB+kLtfAjyiql5V3Q3sAJbHKm9m9NS1WVCY6NJTPKGRzO02TmHMi0ebwudFZJ1bvRRcWmgasC9sn0o37Qgicp2IrBSRlbW1tbHOqxmhegsKE156j5KCD5HD01+YsWe0fzP/A8wBlgDVwJ1ueqRWSI30Aap6l6ouU9VlJSUlMcmkiQ6fP0Bje7cFhQkuPcWD1xfA5w9w778qSPEkWceDMWxUg4KqHlRVv6oGgLs5XEVUCcwI23U6sH8082air8GdnK7IVtma0LLTPLR0+nh3byOtXh+Tcm2BnbFsVIOCiEwJe/lhINgz6RngchFJE5FZwFzg7dHMm4m+4Lq8Nnf+xJafmUpjexfba1oAeOS6k+KcI9OfmHUBEJGHgTOAYhGpBL4NnCEiS3CqhiqA6wFUdaOIPAZsAnzAjarqj1XezOgILsFoXVIntoLMFHwBZc3eRjJTPUzNSx/4TSZuYhYUVPWKCMm/72f/O4A7YpUfM/qCi7XbIu0TW3AN7T+tquS4aXnWnjDGWRcAEzP1bV4Aa2ie4MKrDz++bHocc2IGw4KCiZngZHjWpjCxFYQtdHTVSeXxy4gZFAsKJmYa2rrITU+2GUsnuHy7KUgo9t9qYqaurYuibOt+ONEV2JKoCcWCgokZG81s4HBJ4VsfWBDnnJjBsFmpTMzUt3UxvSAz3tkwceZJEip+eFG8s2EGyUoKJmbq22zabGMSjQUFExOq6kybbWMUjEkoFhRMTDR3+uj2q5UUjEkwFhRMTDTYGAVjEpIFBRMTdTbFhTEJyYKCiYngvEdWfWRMYrGgYGLC5j0yJjFZUDAxUd/mLLBjQcGYxGJBwcREfZuX9JQkMlNtfKQxicSCgomJurYuirJs3iNjEo0FBRMTDTbvkTEJKWZBQUTuFZEaEdkQlvYTEdkiIutE5EkRyXfTy0WkQ0TWuI//jVW+zOhoaO8m32bHNCbhxLKkcD9wfq+0l4BjVXURsA24OWzbTlVd4j5uiGG+zCho9frISbf2BGMSTcyCgqq+DtT3SntRVX3uy7cAW5tvnGrt9JGdZkHBmEQTzzaFTwF/C3s9S0RWi8hrInJqX28SketEZKWIrKytrY19Ls2wtHp9ZKdZ9ZExiSYuQUFEbgF8wINuUjVQpqpLgf8CHhKR3EjvVdW7VHWZqi4rKSkZnQybIQkE1AkKVn1kTMIZ9aAgItcAHwA+oaoKoKpeVa1zn68CdgJHj3beTHS0d/sByLHqI2MSzqgGBRE5H/gG8EFVbQ9LLxERj/t8NjAX2DWaeTPR09rpNBtlWVAwJuHE7L9WRB4GzgCKRaQS+DZOb6M04CURAXjL7Wl0GvBdEfEBfuAGVa2P+MFmzGv1OlNcWPWRMYlnUP+1IvJF4D6gBbgHWArcpKov9vUeVb0iQvLv+9j3CeCJweTFjH0tbknBqo+MSTyDrT76lKo2A+8HSoBrgR/GLFcmoVU3dQJWUjAmEQ02KIj780LgPlVdG5ZmTA//+eC7ADZOwZgENNigsEpEXsQJCi+ISA4QiF22TKLq9h/+syiyVdeMSTiDvZX7NLAE2KWq7SJShFOFZEwPnW531E+8p4zSnPQ458YYM1SDCgqqGhCRg8ACEbE6AdOnzm6npDB/ck6cc2KMGY7B9j76EXAZsAmnyyiAAq/HKF8mQQVLCmkpnjjnxBgzHIO96/8QME9VvTHMixkHvD4nKKRbUDAmIQ22oXkXYLObmQEFq4/Sk239JmMS0WBLCu3AGhF5GQiVFlT1CzHJlUlYVn1kTGIbbFB4xn0Y0y8rKRiT2AYMCu5EdVep6jmjkB+T4KxNwZjENuDtnKr6gXYRyRuF/JgEFyopWFAwJiENtvqoE1gvIi8BbcFEa1MwvQXbFNJTrPrImEQ02KDwrPswpl+dVn1kTEIb7IjmP8Q6I2Z8ONzQbEHBmEQ02BHNu3FGMPegqrOjniOT0A53SbXqI2MS0WCrj5aFPU8HPgYU9vcGEbkXZy3mGlU91k0rBB4FyoEK4OOq2uBuuxln4j0/8AVVfWHQZ2HGDG+3HxFIsy6pxiSkQf3nqmpd2KNKVX8BnDXA2+4Hzu+VdhPwsqrOBV52XyMiC4DLgYXue34bXLPZJJZOX4C05CTc5VaNMQlmsNVHx4e9TMIpOfQ7Daaqvi4i5b2SL8FZtxngD8A/gG+46Y+4cyvtFpEdwHLgzcHkz4wdnd1+a2Q2JoENtvrozrDnPmA38PFhHG+SqlYDqGq1iJS66dOAt8L2q3TTTIJp6ugmx5bhNCZhDXqRHVXdFZ4gIrOimI9IdQ1HNGy7x70OuA6grKwsilkw0bC/sYOpeRnxzoYxZpgG2xr4+CDTBnJQRKYAuD9r3PRKYEbYftOB/ZE+QFXvUtVlqrqspKRkGFkwsbS/sZNp+RYUjElU/ZYURGQ+TuNvnoh8JGxTLk4vpKF6BrgG+KH78+mw9IdE5GfAVGAu8PYwPt/Ekc8f4EBzJ9MKLCgYk6gGqj6ah9OtNB+4OCy9Bfhsf28UkYdxGpWLRaQS+DZOMHhMRD4N7MXp2oqqbhSRx3BWdvMBN7pzLpkEUtPixR9QplpJwZiE1W9QUNWngadF5CRVHVJPIFW9oo9NZ/ex/x3AHUM5hhlbDjZ3AjApNy3OOTHGDNdg2xTqRORlEdkAICKLROTWGObLJKD2Lqdwl5VqvY+MSVSDDQp3AzcD3QCqug5nsJkxIcGgkGlBwZiENdigkKmqvRt+fdHOjEls7V3On0RGqg1eMyZRDTYoHBKRObhjB0Tko0B1zHJlElKo+ijNgoIxiWqw5fwbgbuA+SJShTOi+RMxy5VJSKHqoxSrPjImUQ12PYVdwDkikoVTuugALgP2xDBvJsF0WPWRMQmv3+ojEckVkZtF5Ncici7QjjPobAfDm/vIjGNtXX5SPEKqTZttTMIaqKTwR6ABZ7bSzwJfB1KBD6nqmthmzSSaji4/GTZDqjEJbaCgMFtVjwMQkXuAQ0CZqrbEPGcm4bR3+aw7qjEJbqByfnfwiTvtxG4LCKYvbV1+Mq3nkTEJbaDbusUi0uw+FyDDfS2AqmpuTHNnEkpHl59Ma2Q2JqENNPeR/YebQWvv8ll3VGMSnHUTMVHTbtVHxiQ8Cwomahrbu8lNT4l3NowxI2BBwUSFqnKwuZPJecNZe8kYM1ZYUDBR0dTRjdcXoDTH1lIwJpFZUDBRccBdYMdKCsYktlHvKiIi84BHw5JmA7fhLPn5WaDWTf+mqj43urkzw3Ww2QvA5FwLCsYkslEPCqq6FVgCICIeoAp4ErgW+Lmq/nS082RG7mBTcClOCwrGJLJ4Vx+dDexUVZttNcE1tHcBUJCVGuecGGNGIt5B4XLg4bDXnxeRdSJyr4gURHqDiFwnIitFZGVtbW2kXUwctHp9iECWjWg2JqHFLSiISCrwQeBPbtL/AHNwqpaqgTsjvU9V71LVZaq6rKSkZDSyagahpdNHdloyIhLvrBhjRiCeJYULgHdV9SCAqh5UVb+qBoC7geVxzJsZolavzwauGTMOxDMoXEFY1ZGITAnb9mFgw6jnyAxbS2c32Wk275ExiS4u/8UikgmcC1wflvxjEVkCKFDRa5sZ41q9PrLTLSgYk+ji8l+squ1AUa+0q+KRFxMdrZ0+8jOt55ExiS7evY/MONFiJQVjxgULCiYqWjt95FibgjEJz4KCiYpWr88amo0ZBywomBHzB5T2Lj851iXVmIRnQcGMWG2LMxleYbY1NBuT6CwomBGrbGgHYHpBRpxzYowZKQsKZsSqGjsAmGFBwZiEZ0HBjFhlgxMUpuZbUDAm0VlQMCNW2dBOUVYqmanW+8iYRGdBwYzYjppWZhVnxTsbxpgosKBgRkRV2XKghXmTc+KdFWNMFFhQMCNS3dRJS6eP+RYUjBkXLCiYEdle0wrA3EkWFIwZDywomBEJjlEoK8yMc06MMdFgQcEM24sbD3DLkxtIEpiUmx7v7BhjosCCghm0p1ZX8ed3KwHo6PJz3R9XARBQ8CTZ2szGjAfWsdwMSiCgfOnRNQB85PjpbKpujm+GjDExEa/lOCuAFsAP+FR1mYgUAo8C5TjLcX5cVRvikT9zpA37m0LPq5s62BwWFC5bNiMeWTLGxEA8SwpnquqhsNc3AS+r6g9F5Cb39TfikzXT29YDLaHnKysa2FzdTE56Muu+/X5ErOrImPFiLLUpXAL8wX3+B+BD8cuK6a3N6ws9X7WngT117cwpybaAYMw4E6+goMCLIrJKRK5z0yapajWA+7M00htF5DoRWSkiK2tra0cpu6bVDQrLZhbw752HqG3xUpKTFudcGWOiLV5B4RRVPR64ALhRRE4b7BtV9S5VXaaqy0pKSmKXQ9NDq9dPqieJcxdMYtvBVrYebKE424KCMeNNXIKCqu53f9YATwLLgYMiMgXA/VkTj7yZyNq8PrLSPHz21NlMzXPGJJTYSmvGjDujHhREJEtEcoLPgfcDG4BngGvc3a4Bnh7tvJm+OUEhmaQkCa2bUGzVR8aMO/HofTQJeNJtoEwGHlLV50XkHeAxEfk0sBf4WBzyZvrQ6vWRneb8uWSnOz/zM62kYMx4M+pBQVV3AYsjpNcBZ492fszgtHU5JQWAyTalhTHjlo1oNoPS6vWTl5ECwDfOn09majLvXzApzrkyxkTbWBqnYMawNq+P7DQPAAVZqdx28QLSUzxxzpUxJtosKJhBafP6yLI1mI0Z9ywomEFp9R5uUzDGjF/2X276parsq++gpdPH9IKMeGfHGBNjFhRMv67/4ype3HQQgNOPthHkxox3Vn1k+rW+ypkye/msQo4qzY5zbowxsWYlBdOvxvZuPnvqLG65aEG8s2KMGQVWUjB9au/y0dHtp8gmvjNmwrCgYPpU19oFQFGWTWdhzERhQcH0qbbVC2BTZBszgVhQMH0KlhQsKBgzcVhQMH2qaekEoMjWTTBmwrCgYPq0cX8zOenJNiuqMROIBQXTpzV7G1kyI5+kJIl3Vowxo8SCgomoo8vP1oMtLJ6eH++sGGNGkQUFE9GG/U34A8qSGfnxzooxZhTFY43mGSLyqohsFpGNIvJFN/12EakSkTXu48LRzps5bM3eRgAWzciLb0aMMaMqHtNc+ICvqOq7IpIDrBKRl9xtP1fVn8YhT6aXDfubmJKXTmmONTIbM5HEY43maqDafd4iIpuBaaOdD9O/ikNtzCmxCfCMmWji2qYgIuXAUmCFm/R5EVknIveKSEEf77lORFaKyMra2trRyuqEoqrsPtRGeXFmvLNijBllcQsKIpINPAF8SVWbgf8B5gBLcEoSd0Z6n6reparLVHVZSYnN7x8LDe3dNHf6KC/KindWjDGjLC5BQURScALCg6r6ZwBVPaiqflUNAHcDy+ORNwPvVNQDMLvEgoIxE008eh8J8Htgs6r+LCx9SthuHwY2jHbeJpLObj/7GzuOSN/f2MG3ntrAnJIsTp5THIecGWPiKR69j04BrgLWi8gaN+2bwBUisgRQoAK4Pg55mxB21LRy/R9XsrO2jS3fO5/0FE9o261PbaDN6+OPn35Pj3RjzMQQj95HbwCR5k14brTzMhHd+tR6Hnhrb+j1v3Yc4uxjJgGw+1Abr2yp4WvnzWPe5Jx4ZdEYE0c2onkCqW3x8sBbe7l48VRe/eoZ5GemcNOf1/ObV3fQ5vXx2tYaAC5eNDXOOTXGxIut0TyBrK9qBOCq985kVnEWf/zUe/jes5v4yQtbueefu2ho72Z2cRZlRdYV1ZiJykoKE8jqvY2IwMKpuQAcNz2Px64/ifuuPZFjpuSSmerhO5csjHMujTHxZCWFCWJXbSv3vrGbk+cUkZXW89d+5rxSzpxXSiCgNk22MROclRQmgG0HW7jy7hWkJifxk48u7nM/CwjGGCspTAD3/auCQ61eHv/cyUzNz4h3dowxY5gFhXGsprmTH7+wlcdXVXLBsZNtbQRjzIAsKIwjje1dpKd46PIH6Ojy84l7VrCnro35k3O4fHlZvLNnjEkAFhTGAFVlXWUT3f4AS8sK8AxQt+/1+fnb+gPsqGnlL+v24xEhNyOFNfsae+yXnpLEHz/9Ht47uyiGuTfGjCcTNig8saqSf+04xPwpOeyr76Ciro2qhg5Sk52297TkJNq7/GSnJzM5N526ti7SkpPIzUgBoKwwk/rWLg61eun0+SkrzMLb7ackJ40ZhZlkpHjYUduKtztAfmYKJTlpTC/I4OhJORRmpbJ6byMb9zfx1q46dtS0srO2DYCSnDQuPHYyk/LSyU1PYWlZPuVFWTy7rpr/9/J2mju7afX6UHXO48TyAvIyUtle08JnT51FbnoKO2pb8QeUr7x/HrOKbVI7Y8zgiQavLglo2bJlunLlyiG/761ddVx+11uh12nJSeSkp3BUaRYZ7nw/Hd1+qps6ESBJhJKcNNq7/LR6fbR0dtPU0U1eRgrF2WmkpXjYVdtKbnoKtS1euvwBAJKTBAX8gcPfcZJAXkYKDe3dAEzKTWNqfgaXLZtBRqqHv60/wKtba/D6Akfke3ZxFu+dU0RxdhonzCzgPbMKbX4iY8yQicgqVV0WaduELCksLcvnS+fM5VPvm0Vntz+qS052+wPUtXbR3NlNeVEWAVVUYX9TB3vq2li9t5GKunbOOaaU984uojQnDWfiWMclS6aFAo/Pr6zYXc+++nZOnlPE8lmFPfY1xphom5AlBWOMmcj6KynY4DVjjDEhFhSMMcaEWFAwxhgTYkHBGGNMyJgLCiJyvohsFZEdInJTvPNjjDETyZgKCiLiAX4DXAAswFm3eUF8c2WMMRPHmAoKwHJgh6ruUtUu4BHgkjjnyRhjJoyxFhSmAfvCXle6aSEicp2IrBSRlbW1taOaOWOMGe/G2ojmSMN1e4yuU9W7gLsARKRWRPaM4HjFwKERvD8R2TlPDHbOE8Nwz3lmXxvGWlCoBGaEvZ4O7O9rZ1UtGcnBRGRlX6P6xis754nBznliiMU5j7Xqo3eAuSIyS0RSgcuBZ+KcJ2OMmTDGVElBVX0i8nngBcAD3KuqG+OcLWOMmTDGVFAAUNXngOdG6XB3jdJxxhI754nBznliiPo5J/QsqcYYY6JrrLUpGGOMiSMLCsYYY0ImZFAYr/Mrici9IlIjIhvC0gpF5CUR2e7+LAjbdrP7HWwVkfPik+uREZEZIvKqiGwWkY0i8kU3fdyet4iki8jbIrLWPefvuOnj9pzBmQZHRFaLyF/d1+P6fAFEpEJE1ovIGhFZ6abF9rxVdUI9cHo17QRmA6nAWmBBvPMVpXM7DTge2BCW9mPgJvf5TcCP3OcL3HNPA2a534kn3ucwjHOeAhzvPs8BtrnnNm7PG2eQZ7b7PAVYAbx3PJ+zex7/BTwE/NV9Pa7P1z2XCqC4V1pMz3silhTG7fxKqvo6UN8r+RLgD+7zPwAfCkt/RFW9qrob2IHz3SQUVa1W1Xfd5y3AZpypUcbteauj1X2Z4j6UcXzOIjIduAi4Jyx53J7vAGJ63hMxKAw4v9I4M0lVq8G5gAKlbvq4+x5EpBxYinPnPK7P261KWQPUAC+p6ng/518AXwcCYWnj+XyDFHhRRFaJyHVuWkzPe8yNUxgFA86vNEGMq+9BRLKBJ4AvqWqzSKTTc3aNkJZw562qfmCJiOQDT4rIsf3sntDnLCIfAGpUdZWInDGYt0RIS5jz7eUUVd0vIqXASyKypZ99o3LeE7GkMKT5lcaBgyIyBcD9WeOmj5vvQURScALCg6r6Zzd53J83gKo2Av8Azmf8nvMpwAdFpAKnuvcsEXmA8Xu+Iaq63/1ZAzyJUx0U0/OeiEFhos2v9Axwjfv8GuDpsPTLRSRNRGYBc4G345C/ERGnSPB7YLOq/ixs07g9bxEpcUsIiEgGcA6whXF6zqp6s6pOV9VynP/XV1T1Pxin5xskIlkikhN8Drwf2ECszzveretxatG/EKeXyk7glnjnJ4rn9TBQDXTj3DV8GigCXga2uz8Lw/a/xf0OtgIXxDv/wzzn9+EUkdcBa9zHheP5vIFFwGr3nDcAt7np4/acw87jDA73PhrX54vTQ3Kt+9gYvFbF+rxtmgtjjDEhE7H6yBhjTB8sKBhjjAmxoGCMMSbEgoIxxpgQCwrGGGNCLCgYA4iI352JMvjod/ZcEblBRK6OwnErRKR4pJ9jTLRYl1RjABFpVdXsOBy3AlimqodG+9jGRGIlBWP64d7J/8hdv+BtETnKTb9dRL7qPv+CiGwSkXUi8oibVigiT7lpb4nIIje9SERedNcF+B1h89WIyH+4x1gjIr9zJ73ziMj9IrLBnVf/y3H4GswEYkHBGEdGr+qjy8K2NavqcuDXOLN19nYTsFRVFwE3uGnfAVa7ad8E/s9N/zbwhqouxZmWoAxARI4BLsOZAG0J4Ac+ASwBpqnqsap6HHBftE7YmEgm4iypxkTS4V6MI3k47OfPI2xfBzwoIk8BT7lp7wMuBVDVV9wSQh7OQkgfcdOfFZEGd/+zgROAd9wZXjNwJjr7CzBbRH4FPAu8OMzzM2ZQrKRgzMC0j+dBFwG/wbmorxKRZPqfxjjSZwjwB1Vd4j7mqertqtoALMaZCfVGei4yY0zUWVAwZmCXhf18M3yDiCQBM1T1VZxFYPKBbOB1nOof3DUADqlqc6/0C4Dg+rovAx91580PtknMdHsmJanqE8C3cJZbNSZmrPrIGEeGu5JZ0POqGuyWmiYiK3Buoq7o9T4P8IBbNSTAz1W1UURuB+4TkXVAO4enOv4O8LCIvAu8BuwFUNVNInIrzipbSTgz3d4IdLifE7yBuzlqZ2xMBNYl1Zh+WJdRM9FY9ZExxpgQKykYY4wJsZKCMcaYEAsKxhhjQiwoGGOMCbGgYIwxJsSCgjHGmJD/HyNZXysQKf4uAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "episodes_list = list(range(len(return_list)))\n",
    "plt.plot(episodes_list, return_list)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('DQN on {}'.format(env_name))\n",
    "plt.show()\n",
    "\n",
    "mv_return = rl_utils.moving_average(return_list, 9)\n",
    "plt.plot(episodes_list, mv_return)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('DQN on {}'.format(env_name))\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
